package fms.core;

import fms.util.CRCaculation;
import fms.util.ObjectUtil;
import fms.util.StringUtil;
import fms.util.SysConstants;
import fms.webservice.FMSData;
import fms.xml.WindRequestXML;
import fms.xml.WindResponseXML;
import org.apache.log4j.Logger;

import java.io.UnsupportedEncodingException;
import java.util.List;

/**
* 通过对比国航、吉祥的多高度层，多航路点风温请求的报文，
* 1、发现回复报文中高度层的排列顺序，不同：国航从大到小、吉祥从小到大 ==> FMS中按请求顺序回复
* 2、回复报文中：国航请求哪些航路点，就回复哪些航路点、吉祥无论请求哪些航路点，都回复所有航路点 ==> FMS中请求什么就按序回复什么
 *
 * 关于风温组回复报
 * 1、风向：Jetplan航路点的风向中只有2位（省略了末尾位），所以，在组报的时候要末尾位填0；
 *          春秋格式为3位；
 *          Grib2计算出来风向值，如果，不足三位需要在首位填0；
 * 2、风速：Jetplan、春秋格式航路点的风速为三位，不足三位起始位补0，入库后0不入库，所以，组报时高位要用0补足3位
* */

public class WindMsgBuilder {
    private Logger logger = Logger.getLogger(WindMsgBuilder.class);
   // private final String fmlRespTextHead = "PWI/WD";
   private final String fmlRespTextHead = "PWI";

    // request：接收查询参数信息，以便按需组装自由文
    // refPlanNoHasWindTem：加载飞行计划中不包含风温度信息的航空公司列表
    // dirAppendZeroRule：风向补0规则 —— left：高位补零，right：低位补零
    public String build(WindRequestXML reqWindXml, WindResponseXML aContent, String refPlanNoHasWindTem,
                        String dirAppendZeroRule, Integer startMarkAlt ,Integer endMarkAlt) {
        logger.debug("[报文构造] 开始进行上传报文构造...");
        String responseFreeText = fmlRespTextHead;
        try {
            // 发出风温请求的航空公司二字码
            String airline = "";
            if ( !ObjectUtil.isBlank(reqWindXml.getFlightID()) ) {
                airline = reqWindXml.getFlightID().substring(0, 2);
                logger.debug("请求风温数据的航空公司二字码：" + airline);
            } else {
                return "";
            }

            //   请求：REQPWI/CQ217/WQ370.330.240:BINOR.SOSMA/DQ217/WRZSPD.ZSNJ0E9E
            //   回复：PWI/WD240,ODULO,290070,240M16.GORPI,290076,240M17.

            String[] reqAlts = reqWindXml.getAlt().split("\\.");

            //需要考虑数据库中不存在某个高度层、航路点信息的情况
            String[] reqCptNames = reqWindXml.getCptname().split("\\.");

            List<FMSData> listFmsData = aContent.getDatas();
            if(startMarkAlt != null && endMarkAlt != null) {
                for (int iAlt = startMarkAlt; iAlt < endMarkAlt; iAlt++) {
                    // 防止请求高度层中有无意义的高度层
                    if (hasAlt(listFmsData, reqAlts[iAlt])) {
                        responseFreeText += "/WD" + reqAlts[iAlt] + ",";
                    }
                    for (int iCptName = 0; iCptName < reqCptNames.length; iCptName++) {
                        FMSData item = findFmsData(listFmsData, reqAlts[iAlt], reqCptNames[iCptName]);
                        if (null != item) {
                            if (item.getWinddir() != null) {
                                // 风速不足3位则高位补0
                                if (dirAppendZeroRule.equals(SysConstants.DATA_FILL_RULE_LEFT)) {
                                    responseFreeText += item.getCptname() + ","
                                            + StringUtil.fillStr(item.getWinddir(), 3, 10, "0")
                                            + StringUtil.fillStr(item.getWindvel(), 3, 10, "0");
                                } else if (dirAppendZeroRule.equals(SysConstants.DATA_FILL_RULE_RIGHT)) {
                                    responseFreeText += item.getCptname() + ","
                                            + StringUtil.fillStr(item.getWinddir(), 3, 30, "0")
                                            + StringUtil.fillStr(item.getWindvel(), 3, 10, "0");
                                }
                                if (!refPlanNoHasWindTem.contains(airline)) {
                                    if ('-' == item.getWindtep().charAt(0)) {
                                        responseFreeText += "," + item.getAlt() + "M"
                                                + item.getWindtep().substring(1, item.getWindtep().length());
                                    } else {
                                        responseFreeText += "," + item.getAlt() + "P"
                                                + item.getWindtep().substring(0, item.getWindtep().length());
                                    }
                                }
                                responseFreeText += ".";
                            }
                        }
                    } // for (int iCptName = 0; iCptName < reqCptNames.length; iCptName++) {

                    // 回复自由文中包含有效风温数据
                    if (responseFreeText.length() > 3) {
                        responseFreeText = responseFreeText.substring(0, responseFreeText.length() - 1);
                    }
                } // for (int iAlt = startMarkAlt; iAlt < endMarkAlt; iAlt++) {
            } // if(startMarkAlt != null && endMarkAlt != null) {
        } catch (Exception e) {
            logger.error(e.getMessage() + "：风温风速组报异常！");
            return "";
        }

//        try {
//            logger.debug("生成CRC开始");
//            responseFreeText += CRCaculation.CRCaculation(responseFreeText);
//        } catch (UnsupportedEncodingException e) {
//            logger.error("CRC生成异常：" + e.getMessage());
//            return "";
//        }
        return responseFreeText;
	}

    // 根据指定高度层和航路点参数，查找风温信息
    public FMSData findFmsData(List<FMSData> list, String alt, String cptName) {
        boolean hasTheAlt = false;
        boolean hasTheCptName = false;
        for (FMSData item : list) {
            if (item.getAlt().equals(alt)
                    && item.getCptname().equals(cptName)) {
                return item;
            }
        }
        return null;
    }

    // 判断指定高度层是否存在
    public boolean hasAlt(List<FMSData> list, String alt) {
        for (FMSData item : list) {
            if (item.getAlt().equals(alt)) {
                return true;
            }
        }
        return false;
    }
}